import pytest
import os
from config.config import *
from utils.database import Database
from utils.config_parser import GetConfig
import logging


# @pytest.fixture(scope="session", autouse=True)
# def destroy_data():
#     logging.info("5555555555555555555555555555555555")
#     yield
#     logging.info("6666666666666666666666666666666666666")
#     # 使用with的方法，方便关闭连接对象
#     with Database() as db:
#         db.execute_sql(SQL1, SQL2)


def pytest_sessionfinish(session):
    logging.info("开始执行最后的清理数据的工作！！！")
    # 判断不存在teardown_executed属性的时候，也就是没有执行过的时候来执行代码
    # hasattr：内置函数，检查对象是否具有指定的属性
    # session.config：pytest框架中的一个配置对象，包含会话相关的所有配置信息
    # teardown_executed：属性名，只要执行清理工作就会有这个属性名
    if not hasattr(session.config,"teardown_executed"):
        with Database() as db:
            db.execute_sql(SQL1, SQL2)
        session.config.teardown_executed = True


# def pytest_fixture_setup(fixturedef):
#     """
#     钩子函数，来判断夹具是否注册生效
#     """
#     if fixturedef.argname == "destroy_data":
#         print("夹具是注册的，并且生效的")


# 设置环境变量
def pytest_configure(config):
    env = config.getoption("--env")  # 获取参数传进来的值
    os.environ["ENV"] = env
    cfg = GetConfig()

    # 根据传进来的不同的参数读取配置文件，设置不同的环境变量
    # 环境变量必须是字符串，不能是字典
    if env == "test":
        os.environ["URL"] = cfg.get_base_url("test_base_url")
        os.environ["DATABASE"] = str(cfg.get_database_data("test_database"))
    elif env == "sting":
        os.environ["URL"] = cfg.get_base_url("sting_base_url")
        os.environ["DATABASE"] = str(cfg.get_database_data("sting_database"))
    elif env == "prod":
        os.environ["URL"] = cfg.get_base_url("prod_base_url")
        os.environ["DATABASE"] = str(cfg.get_database_data("prod_database"))

    # 设置mock的基础url的环境变量
    os.environ["MOCK_URL"] = cfg.get_base_url("mock_url")


# 钩子函数
def pytest_addoption(parser):
    parser.addoption(
        "--env",
        action="store",
        default="test",
        help="运行时的环境配置参数（test,sting,prod）"
    )


def pytest_collection_modifyitems(items):
    # config:pytest的配置信息，比如命令行参数，插件配置
    # items：测试用例列表，每个元素都是pytest.item对象，表示一个具体的测试用例
    # print(config.getoption("--env"))
    for item in items:
        case = item.callspec.params.get("case", {})
        # 判断is_true为False的时候跳过测试
        if not case.get("is_true"):
            item.add_marker(pytest.mark.skip(reason="标记为跳过的测试用例"))

        # 判断失败重试的次数大于0的时候去进行失败重试
        if case.get("reruns") > 0:
            item.add_marker(pytest.mark.flaky(reruns=case.get("reruns")))
